#pragma once

#include <string>
#include <fstream>
#include <vector>

//#include "../matrix/Matrix.h"

using namespace std;


class CFileIO
{
public:
	CFileIO(void);
	~CFileIO(void);

    int& SetFieldWidth() {return _nSetFieldWidth;}

    void OpenFileRead(const string& sFileName_);
    void CreateCWDir(string& sDirName_);
	void OpenFileWrite(const string& sFileName_, bool bCheckFileExist_=false );
    void GetFileSize(int* nFileSize_ );
    void CloseFile();
	bool ReadLine(string* pLine_);
	void ReadFile(string* pStr_);
	bool IsEOF() const;
    void CheckFileExist(const string& sFileName_);
    void DelFile(const string& sFileName_);

	void WriteDoubleMatToFile(const CMatrix<double>& mMat_, const string& sHeader_ = "");
	void WriteIntMatToFile(const CMatrix<int>& mMat_, const string& sHeader_);
	void WriteDoubleVecToFile(const vector<double>& vVec_, const string& sHeader_);
	void WriteUIntVecToFile(const vector<unsigned int>& vVec_, const string& sHeader_);
	void WriteIntValToFile(const int& nVal_, const string& sHeader_);
	void WriteDoubleValToFile(const double& nVal_, const string& sHeader_);
    void WriteIntValToFile(const int& nVal_);
    void WriteDblValToFile(const double& dVal_);
    void WriteStrValToFile(const string& strVal_);
    void WriteSpace();
    void WriteTab();
    void WriteEndl();
    const string& currentWD() const {return _sCWD;}

protected:
          string& setCurrentWD()    {return _sCWD;}

	// retrievers
	const	int&	GetLinesRead()	const	{return _nLinesRead;}
private:
	fstream  _File;
	int		 _nLinesRead;
	string   _sCWD;
    int      _nSetFieldWidth;
};